package com.mind.core.net.msg;

import io.netty.buffer.ByteBuf;

import com.mind.core.net.model.IConnector;



/**
 * 消息的接口,消息数据包的格式 <len(2字节)>+<type(2字节)>+<body(len-4)>
 */
public interface Message {
	  /** 系统默认的编码,UTF-8 {@index} */
    public static final String DEFAULT_CHARSET                   = "UTF-8";
	/** 最大消息长度为32K，可能超过这个长度的信息，需要自己打包分多次发送* */
	public static final int MAX_MESSAGE_LENGTH = 1024 * 32;

	/** 从客户端接收的消息估计长度,64字节,对于从客户端接收的数据来说，都是简单的命令，很少超过64B * */
	public static final int DECODE_MESSAGE_LENGTH = 64;

	/** 发送给客户端的消息长度,一般也少于512 * */
	public static final int ENCODE_MESSAGE_LENGTH = 512;

	/** 消息头的长度的字节数 {@value} */
	public static final int HEADER_LEN_BYTES = 2;

	/** 消息头的类型字节数 {@value} */
	public static final int HEADER_TYPE_BYTES = 2;

	/** 消息头的长度,4字节,length+type,{@value} */
	public static final int HEADER_SIZE = HEADER_LEN_BYTES + HEADER_TYPE_BYTES;

	/** 最小命令长度，只有消息头 * */
	public static final int MIN_MESSAGE_LENGTH = HEADER_SIZE;

	public static final int MIN_CACHE_MESSAGE_LENGTH = 6;

	/**
	 * 设置用于解析消息或者输出消息的ChannelBuffer
	 * 
	 * @param buf
	 *            被操作的ByteBuf对象,不能为空
	 */
	public void setBuffer(ByteBuf buf);
	public ByteBuf getBuffer();
	/**
	 * 从由setBuffer设置的消息数据缓存中解析出该消息的数据
	 * 
	 * @return true,解析成功;false,解析失败
	 * @throws MessageParseException
	 */
	public boolean read() throws MessageParseException;

	/**
	 * 将该消息的数据写入到由setBuffer设置的消息数据缓存
	 * 
	 * @return true,写入成功;false,写入失败
	 * @throws MessageParseException
	 */
	public boolean write() throws MessageParseException;
	/**
	 * 读取buffer中的数据到消息中对应的属性中
	 * 
	 * @return true,读取成功;false,读取失败
	 */
	public  boolean readImpl();

	/**
	 * 将消息的属性按照消息格式写入到buffer中
	 * 
	 * @return true,写入成功;false,写入失败
	 */
	public  boolean writeImpl();
	
	/**
	 * 取得该消息的类型
	 * @return
	 */
	public short getMessageType();
	/**
	 * 取得该消息的名称
	 * 
	 * @return
	 */
	public String getMessageName();

	/**
	 * 取得该消息的长度
	 * 
	 * @return
	 */
	public int getLength();

	/**
	 * 取得该类型消息缓存区的初始大小,该大小可能不是消息的实际大小,它是为了初始化用于存入该消息数据的ChannelBuffer的大小,在具体的子类中
	 * 可以提供更为精确的缓存区初始化大小
	 * 
	 * @return
	 */
	public int getInitBufferLength();
	public void setSender(IConnector player);
	public IConnector sender();
}
